﻿// Author: Prasanna V. Loganathar
// Project: SharpLog.Desktop
// 
// Copyright 2014 Launchark. All Rights Reserved.
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//  
// Created: 4:46 PM 11-05-2014

namespace SharpLog.Desktop
{
    using System;

    public class ConsoleLogger : SynchronousFormattableLogger
    {
        private bool isSynchronized;

        private Action<string> executeAction;

        public ConsoleLogger()
        {
            SetSynchronizationMode(false);
        }

        public ConsoleLogger(bool isSynchronized)
        {
            SetSynchronizationMode(isSynchronized);
        }

        public override bool IsSynchronized
        {
            get
            {
                return isSynchronized;
            }
        }

        public void SetSynchronizationMode(bool isSynchronized)
        {
            this.isSynchronized = isSynchronized;
            if (isSynchronized)
            {
                executeAction = WriteToConsoleSynchronized;
            }
            else
            {
                executeAction = WriteToConsole;
            }
        }

        protected override void Dispose(bool disposing)
        {
        }

        public override string Format(string text, LogLevel level, string callerName)
        {
            return string.Format("{0}: {1} -> {2}", level.ToString().ToUpperInvariant(), callerName, text);
        }

        protected void WriteToConsole(string text)
        {
            Console.WriteLine(text);
        }

        protected void WriteToConsoleSynchronized(string text)
        {
            lock (Console.Out)
            {
                WriteToConsole(text);
            }
        }

        protected override void Execute(LogLevel level, string text, string callerName)
        {
            executeAction(text);
        }
    }
}